package co.edu.javeriana.konigsberg.xavier.servicio;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import co.edu.javeriana.konigsberg.xavier.dao.desc.ConferencistaDAOLocal;
import co.edu.javeriana.konigsberg.xavier.dao.desc.ProgramaDAOLocal;
import co.edu.javeriana.konigsberg.xavier.dao.desc.SesionConferencistaDAOLocal;
import co.edu.javeriana.konigsberg.xavier.dao.desc.SesionDAOLocal;
import co.edu.javeriana.konigsberg.xavier.dto.SesionDTO;
import co.edu.javeriana.konigsberg.xavier.entidad.Conferencista;
import co.edu.javeriana.konigsberg.xavier.entidad.Sesion;
import co.edu.javeriana.konigsberg.xavier.entidad.Sesionconferencista;

@Stateless
public class SesionServicio implements SesionServicioRemote, SesionServicioLocal {

	@EJB
	private SesionDAOLocal sesionDAOLocal;
	
	@EJB
	private SesionConferencistaDAOLocal sesionConferencistaDAOLocal;
	
	@EJB
	private ConferencistaServicioLocal conferencistaServicioLocal;
	
	@EJB
	private ProgramaDAOLocal programaDAOLocal; 
	
	@EJB
	private ConferencistaDAOLocal conferencistaDAOLocal;
	
	@Override
	public void guardarSesion(SesionDTO sesionDTO) {
		Sesion sesion = getEntity(sesionDTO);
		
		sesionDAOLocal.guardar(sesion);
		
		sesionDTO.setIdsesion(sesion.getIdsesion());
		
		Sesionconferencista sesionconferencista = new Sesionconferencista();
		sesionconferencista.setIdConferencista(sesionDTO.getIdConferencista());
		sesionconferencista.setIdSesion(sesion.getIdsesion());
		sesionconferencista.setNumeroHoras(0);//TODO ajustar cantidad de horas
		
		//sesionConferencistaDAOLocal.guardar(sesionconferencista);
	}

	public Sesion getEntity(SesionDTO sesionDTO) {
		Sesion sesion = new Sesion();
		sesion.setFecha(sesionDTO.getFecha());
		sesion.setHoras(sesionDTO.getHoras());
		sesion.setPrograma(programaDAOLocal.obtenerPorId(sesionDTO.getIdPrograma()));
		sesion.setIdsesion(sesionDTO.getIdsesion());
		sesion.setModulo(sesionDTO.getModulo());
		sesion.setNumeroSesion(sesionDTO.getNumeroSesion());
		sesion.setRequerimientos(getStringConcatenados(sesionDTO.getRequerimientos()));
		sesion.setTemas(getStringConcatenados(sesionDTO.getTemas()));
		return sesion;
	}
	
	public SesionDTO getDTO(Object object) {
		Sesion sesion = (Sesion)object;
		SesionDTO sesionDTO = new SesionDTO();
		sesionDTO.setFecha(sesion.getFecha());
		sesionDTO.setHoras(sesion.getHoras());
		sesionDTO.setIdPrograma(sesion.getPrograma().getIdPrograma());
		sesionDTO.setIdsesion(sesion.getIdsesion());
		sesionDTO.setModulo(sesion.getModulo());
		sesionDTO.setNumeroSesion(sesion.getNumeroSesion());
		sesionDTO.setRequerimientos(getListString(sesion.getRequerimientos()));
		sesionDTO.setTemas(getListString(sesion.getTemas()));
		Sesionconferencista sesionconferencista = sesionConferencistaDAOLocal.consultarSesionConferencistaPorIdSesion(sesion.getIdsesion());
		if(sesionconferencista!=null){
			sesionDTO.setIdConferencista(sesionconferencista.getIdConferencista());
			Conferencista conferencista = conferencistaDAOLocal.obtenerPorId(sesionconferencista.getIdConferencista());
			sesionDTO.setConferencistaDTO(conferencistaServicioLocal.getDTO(conferencista));
		}
		return sesionDTO;
	}
	
	private List<String> getListString(String requerimientos) {
		StringTokenizer stk = new StringTokenizer(requerimientos, ";");
		List<String> strings = new ArrayList<String>();
		while(stk.hasMoreElements()){
			strings.add(stk.nextToken());
		}
		return strings;
	}

	private String getStringConcatenados(List<String> strings) {
		String stringReturn = "";
		if(strings != null){
			for (String string : strings) {
				stringReturn += string + ";";
			}
		}
		return stringReturn;
	}

	@Override
	public List<SesionDTO> consultarSesionesPorIdPadre(BigInteger idPrograma) {
		List<Sesion> sesions = sesionDAOLocal.obtenerListaPorPadre(idPrograma);
		List<SesionDTO> sesionDTOs = new ArrayList<SesionDTO>();
		for (Sesion sesion : sesions) {
			SesionDTO sesionDTO = getDTO(sesion);
			sesionDTOs.add(sesionDTO);
		}
		return sesionDTOs;
	}
	

}
